#include <bits/stdc++.h>
using namespace std;
struct node {
  int x;  // 位置
  bool b; // 是否小球
};
node a[400005];
int n, m;
long long ans;
long long z[200005];       // 小球距左边洞的距离
long long y[200005];       // 小球距右边洞的距离
bool cmp(node x, node y) { // 按位置排序
  return x.x < y.x;
}
// 先往左移动k，再往右移，全部进洞需要的次数
long long fl(long long k) {
  long long ret = 0;
  for (int i = 1; i <= n; i++) {
    if (z[i] > k) {
      ret = max(ret, k + y[i]);
    }
  }
  return ret + k;
}
// 先往右移动k，再往左移，全部进洞需要的次数
long long fr(long long k) {
  long long ret = 0;
  for (int i = 1; i <= n; i++) {
    if (y[i] > k) {
      ret = max(ret, k + z[i]);
    }
  }
  return ret + k;
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].x;
    a[i].b = 1;
  }
  for (int i = n + 1; i <= n + m; i++) {
    cin >> a[i].x;
    a[i].b = 0;
  }
  sort(a + 1, a + n + m + 1, cmp); // 按位置排序
  long long d = -1e18; // 距离目前小球最近的左边的洞的位置
  for (int i = 1, j = 1; i <= n + m; i++) { // 求每个小球到左边洞的距离
    if (a[i].b == 0) {
      d = a[i].x;
    } else {
      z[j] = a[i].x - d;
      j++;
    }
  }
  d = 1e18;
  for (int i = m + n, j = n; i >= 1; i--) { // 求每个小球到右边洞的距离
    if (a[i].b == 0) {
      d = a[i].x;
    } else {
      y[j] = d - a[i].x;
      j--;
    }
  }
  // 三分法求最小值
  // 先左移的最少次数
  long long l = 0;
  long long r = 1e18;
  while (r - l > 1) {
    long long ml = (l + r) / 2;
    long long mr = (ml + r) / 2;
    if (fl(ml) >= fl(mr)) {
      l = ml;
    } else {
      r = mr;
    }
  }
  ans = min(fl(l), fl(r));
  // 先右移的最小次数
  l = 0;
  r = 1e18;
  while (r - l > 1) {
    long long ml = (l + r) / 2;
    long long mr = (ml + r) / 2;
    if (fr(ml) >= fr(mr)) {
      l = ml;
    } else {
      r = mr;
    }
  }
  ans = min(ans, min(fr(l), fr(r)));
  cout << ans;
  return 0;
}